package org.arquimedes.dispatcher.hilos;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import org.arquiemedes.utilitarios.Constantes;
import org.arquimedes.dispatcher.Dispatcher;
import org.arquimedes.dispatcher.Replicador;
import org.arquimedes.servicios.ServicioEnviarMail;
import org.arquimedes.servicios.ServicioPropiedades;


public class HiloProcesadorAlarmas extends Thread {

	/**
	 * Identificador de la solicitud de procesamiento, es utilizado para
	 * verificar que ya se recibi� respuesta de un hilo
	 */
	private int identificador=0;
	
	/**
	 * Llave privada para desencriptar la trama
	 */
	private byte[] encKey;

	/**
	 * Trama encriptada a procesar por el hilo
	 */
	private byte[] sigToVerify;

	/**
	 * Ip del sistema procesador de alarmas
	 */
	private String ip;
	
	/**
	 * Puerto para enviar el mensaje a los procesadores
	 */
	private static int PUERTO=Integer.valueOf(ServicioPropiedades.getServicio().obtenerPropiedad(Constantes.PUERTO));

	/**
	 * Constructor del hilo con el id
	 * @param identificador Id del hilo
	 * @param encKey Llave privada para la desencripci�n
	 * @param sigToVerify Trama para desencriptar
	 */
	public HiloProcesadorAlarmas(int identificador, byte[] encKey, byte[] sigToVerify, String ip) {
		this.identificador=identificador;
		this.encKey=encKey;
		this.sigToVerify=sigToVerify;
		this.ip=ip;
	}
	
	@Override
	public void run() {
		super.run();
		
		try {
			Socket sistemaProcesadorAlarmas=new Socket(ip, PUERTO);
			ObjectOutputStream flujoSalida = new ObjectOutputStream(sistemaProcesadorAlarmas.getOutputStream());
			ObjectInputStream flujoEntrada = new ObjectInputStream(sistemaProcesadorAlarmas.getInputStream());
			flujoSalida.writeObject(encKey);
			flujoSalida.writeObject(sigToVerify);
			flujoSalida.flush();
			
			Integer respuesta=null;
			
			while ( (respuesta=(Integer) flujoEntrada.readObject()) ==null){
				switch (respuesta) {
				case Constantes.BLOQUEAR_IP:
					String mensaje=(String) flujoEntrada.readObject();
					String mailTo=(String) flujoEntrada.readObject();
					Replicador.obtenerReplicador().responderProceso(this.identificador, respuesta, mensaje, mailTo);
					break;
				case Constantes.LLAMAR_AUTORIDADES:
                                    String mensaje2=(String) flujoEntrada.readObject();
                                    String mailTo2=(String) flujoEntrada.readObject();
                                    ServicioEnviarMail.getServicio().enviarMensajeAMail(mailTo2, mensaje2);
					
					break;
				default:
					System.err.println("La respuesta del sistema de procesamiento de alarmas no es valida");
					break;
				}
			}
		} catch (Exception e) {
			// El servidor no responde!
			Replicador.obtenerReplicador().informarBajaSistema(ip);
		}
	}

	/**
	 * @return Retorna identificador
	 */
	public int getIdentificador() {
		return identificador;
	}

	/**
	 * @return Retorna encKey
	 */
	public byte[] getEncKey() {
		return encKey;
	}

	/**
	 * @return Retorna sigToVerify
	 */
	public byte[] getSigToVerify() {
		return sigToVerify;
	}

	/**
	 * @return Retorna ip
	 */
	public String getIp() {
		return ip;
	}
	
}
